/*
 * Copyright (C) 2012 POAS.VSTU
 */

package ui;

import java.awt.Color;
import java.awt.Label;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import model.Gamer;
import model.Player;

/**
 * UI-представлние игрока
 */
public class UIPlayer {
    
    /** Модель игрока */
    private Player mPlayerModel;
    /** UI-колода игрока */
    private UIPlayerCardPile mUICardPile;
    /** Представление имени игрока */
    private JLabel mNameLabel;     
    /** Представление количества карт на руках игрока */
    private JLabel mNumCardsLabel;
    
    /** Левый верхний угол отображения игрока */
    private Point mPosition;
    
    private UIGamePanel mPanel; 
    
    /**
     * Конструктор
     * @param player модель игрока
     * @param panel панель, в которую будет добавлено представление игрока
     */
    UIPlayer(Player player, UIGamePanel gamePanel) {
        mPlayerModel = player;
        mPanel = gamePanel;
        mUICardPile = new UIPlayerCardPile(mPlayerModel.getCards(), this, gamePanel);
        if(player instanceof Gamer) {
            mUICardPile.turnFaceUp();
        } else {
            mUICardPile.turnFaceDown();
        }

        mNameLabel = new JLabel();
        gamePanel.add(mNameLabel);
        mNameLabel.setText(getName());
        mNameLabel.setForeground(Color.white);
        mNameLabel.setBounds(0, 0, 80, 30);
        
        
        mNameLabel.setVisible(true);
        
        mNumCardsLabel = new JLabel();
        gamePanel.add(mNumCardsLabel);
        mNumCardsLabel.setText("0");
        mNumCardsLabel.setForeground(Color.white);
        mNumCardsLabel.setBounds(10, 10, 80, 30);
        mNumCardsLabel.setVisible(true);
    }
    
    /** Ориентация игрока */
    public Orientation getOrientation() {
        return mUICardPile.getOrientation();
    }
    
    /** Задать ориентацию стопки */
    public void  setOrientation(Orientation orientation) {
        mUICardPile.setOrientation(orientation);
    }

    /** 
     * Повернуть игрока.
     * @param steps кол-во поворотов в шагах. Один шаг соответствует повороту на
     * 90 градусов. Положительные значения соответствуют повороту по часовой стрелке,
     * отрицательные - против часовой стрелки.
     */
    public void rotate(int steps) {
        Orientation result = getOrientation();
        for(int i = 0; i < steps; i++) {
            if( result == Orientation.NORMAL ) {
                result = Orientation.ROTATED_ANTI_CLOCKWISE;
            } else if( result == Orientation.INVERTED ) {
                result = Orientation.ROTATED_CLOCKWISE;
            } else if( result == Orientation.ROTATED_CLOCKWISE ) {
                result = Orientation.NORMAL;
            } else if( result == Orientation.ROTATED_ANTI_CLOCKWISE ) {
                result = Orientation.INVERTED;
            }
        }
        setOrientation(result);
    }
    
    /** Позиция */
    public Point getLocation() {
        return new Point();
    }

    /** Задать позицию */
    public void setLocation(Point p) {
        mPosition = p;
        
        mNameLabel.setLocation(p);
        mNumCardsLabel.setLocation((int) p.getX() - 100, (int) p.getY() - 30);
        
        mNameLabel.getParent().paintAll(mNameLabel.getParent().getGraphics());
        mNumCardsLabel.getParent().paintAll(mNumCardsLabel.getParent().getGraphics());
        
        
        mUICardPile.setLocation(p);
    }
    
    /** Получить имя игрока */
    public final String getName() {
        return mPlayerModel.getName();
    }
    
    /** Границы стопки */
    public Rectangle getBounds() {
        return new Rectangle();
    }   
    
    UIPlayerCardPile getUICardPile() {
        return mUICardPile;
    }
    
    public void actionUpdateLabels(JComponent previousComponent) {
        actionSetLabels(previousComponent);
    }
    
    private void actionSetLabels(JComponent previousMoved) {
        Action action = new Action(previousMoved, 0);
        action.setLabel(mNumCardsLabel, String.valueOf(mUICardPile.getModel().size()));
        mPanel.addMovement(action);
    }
    
    public UICardPile getUIPile() {
        return mUICardPile;
    }
}
